'''
相传在古印度圣庙中，有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上，
有三根杆(编号A、B、C)，在A杆自下而上、由大到小按顺序放置64个金盘(如图1)。
游戏的目标：把A杆上的金盘全部移到C杆上，并仍保持原有顺序叠好。操作规则：
每次只能移动一个盘子，并且在移动过程中三根杆上都始终保持大盘在下，小盘在上，
操作过程中盘子可以置于A、B、C任一杆上
'''

'''
解：
假设 有 A B C 三个柱子，每次移动一个圆盘，
且小圆盘必须放在大圆盘上面将量级降为3，初始A
柱有三个圆盘，圆盘名称为大中小那么移动的步骤是 
1. A -小-> B
2. A -中-> C
3. C -小-> B
4. A -大-> C
5. B -小-> A
6. B -中-> C
7. A -小-> C

分析规律：
一、
1 2 3 步骤可视为将小中两个盘子同时移动到B，扩散到n级时就是将n-1个盘子同时移动到B
4 步骤可视为将第n个盘子（数量为1）从A移动到C
5 6 7 步骤可视为将小中两个盘子同时移动到C，扩散到n级时就是将n-1个盘子同时移动到B
二、
上述观点1过程总结将n-1个盘子从A经过C移动到B，因此可以作为一次递归调用自身去执行

上述观点2过程总结将1个盘子从A移动到C，因此可作为函数中可执行部分直接打印，但需要
注意的是每次第n个盘子不一定是固定从A移动到C因此前后的柱子名称应以外部传参的值为准

上述观点3过程与观点一类似，是从从B经过A移动到C因此可以作为一次递归调用自身去执行

结束条件n==0
'''

def hoiai(n,a,b,c):
    if n >0:
        hoiai(n-1,a,c,b)
        print("从{0}移动到{1}".format(a,c))
        hoiai(n-1,b,a,c)

hoiai(3,"A","B","C")

